查看原文
其他

自娱自乐写爬虫 世纪佳缘篇

2017-03-10 腩啵兔子 Python爱好者社区


腩啵兔子,Python社区专栏作者

博客:https://zhuanlan.zhihu.com/pythoncoder


引言

最近一段时间不知怎得像是中了什么魔怔,特别的想用python写一个网络爬虫,也许是看了知乎上的某位大牛的分享,深感能自己写一个程序在浩瀚的互联网数据海洋中发现有意思的数据的酷炫,抑或就是想单纯的体验一把程序猿的人生价值。在当我信誓旦旦的决定用一到两周准备实现这个宏伟的理想的时候,我马上就遇到了瓶颈,而且是必须快速解决的要给难题:我应该在互联网上爬点什么数据呢?


背景

经过一番深入的考察,我发现婚恋网站是一个理想的目标,因为在博客园里面还从来没有看到过相关的帖子(其实博客园里面大部分帖子感觉挺水的),而且婚恋网站上的数据也是有不错的研究价值的(嘿嘿,我的目的很单纯,完全是为了学术研究),可以分析分析当前婚恋状况,还是挺有显示意义的。目前中国有三个比较大的婚恋网站:百合网、珍爱网、世纪佳缘,由于精力有限,应该选哪个网站呢?经过严密的考证(其实就随便百度了一下),世纪佳缘是目前三个婚恋网站上用户最多的一个,二话不多说,敞开膀子就去世纪佳缘实名注册了一个用户,仔细的分析了网站页面的构成以及下载网页的策略。

用户主页的网址组成非常的简单,每个用户都一个唯一的id,在网址栏中在域名后面加上这个id就是用户的个人主页了,而且这个个人主页的数据不是动态生成的,直接用解析网页就可以获取所有的信息。唯一的难点在于某些信息,例如工资,是否买房买车之类的信息在没有登陆的情况下是不可见的。为了能获取一份完整的数据(工资这么重要的数据,怎么能不关注呢,不难下载的数据就没有啥价值了),我还是费了相当多的精力,基本是百分之60的时间都花在怎么解决这个问题上了(对于某些大牛来说当然是小case,我只是一介菜鸟)。



实现方案

接着的一个问题是,我怎么获取用户的id呢?不得不说,世纪佳缘还是提供一个挺不错的搜索功能的,在选择好搜索条件后,根据抓包的信息,浏览器会把用户选择的参数post提交给服务器,服务器会以json格式返回25个用户的简短信息,一页刚好是25个用户的资料,如果要连续的爬取数据,根本不需要修改任何参数,自需要把第几页这个参数更换一下,就可以源源不断的下载这些用户的个人主页了。我呢,为了尽可能多的下载一些数据,选的条件比较松,也就是20到28岁有照片的女性,结果搜出来用户数量让我大吃一惊,也不过才七十多万条,之后爬的过程中还发现不少搜索出来的用户id都在黑名单里,中国第一婚恋网站名不副实啊!



分析完爬虫策略之后,着手的第一件事就是怎么实现自动登录,最出用的是python自带的模块urllib2,抓包对比一下python发送的请求和浏览器发送的请求,发现python发送的请求头部中Connection始终未Closed,不怎怎么设置都不行,后来百度一下之后才知道urllib2不支持的原因。万里长征刚迈出第一步就扯着蛋了,之后征途漫漫怎么走呢?多亏了论坛里的大神提醒,原来python有一个第三方木块requests,实现起来非常方便,大大的减少了工作量。那我是怎么实现自动登陆的呢?


import socketimport sslsock = ssl.wrap_socket(socket.socket()) sock.connect((host,443))sock.sendall(https_data)recv_data = sock.recv(8912)sock.close()


因为在验证用户名和密码的时候会通过ssl加密,中间可能还有好几次客户端与服务器的数据交换,我也在网上找了一些关于自动登陆的帖子,大部分都不适用,唯一实用的就是这一段代码了,只需要把浏览器抓取登陆时的主机名(host)和发送的数据(https_data,包括header和body),用上面短短的几行代码就可以通过服务器端的验证,唯一比较繁琐的接受到的数据是经过压缩的,解压之后获取跳转的网址并且把获取的cookie保存起来用以之后的请求,自动登陆就算大功告成啦!

剩下的就是比较简单也是比较繁琐的工作了,解析页面直接用的是正则表达式,用起来非常的高效,不需要了解html全部的结构。解析好之后把数据通过sqlite3插到数据库里就可以了,这部分就一笔带过,因为确实没什么好讲的。为了加快速度,我实现的时候用了多线程,结果效果没有想象的那么好,以后再好好琢磨琢磨吧!



最后的左后,还是把代码拿出来跟大家一起分享啦!运行这个代码需要安装一下python2.7以及最新的requests(我用的是这个版本),写的不好的地方还请大家多多包涵。


代码获取: 关注公众号,“Python爱好者社区”,回复“代码”即可获取。


Python爱好者社区


为大家提供与Python相关的最新技术和资讯。


长按指纹 > 识别图中二维码 > 添加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存